/**
 * @addtogroup brd_pmc
 * brd_pmc
 * @{
 */
/**
 * @file brd_pmc.h
 * @brief 电源模式切换板级层
 * @note 配合时钟模式达到系统低功耗要求
 * @par 修改日志
 * <table>
 * <tr><th>Date <th>Version <th>Author <th>Description
 * <tr><td>2020-09-30 <td>1.0 <td>软件工程院 <td>创建初始版本
 * @par 示例
 * @code
 * 使用电源模式切换设备. 
   ...
   Int32 mode = Brd_PmcMode();
   ...
   Int32 handle = Brd_PmcCreateWakeLock("my wake lock", 13);
   Brd_PmcAcquireWakeLock(handle);
   ...
   Brd_PmcReleaseWakeLock(handle);
   ...
   Brd_PmcSetMode(0);
   ...
 * @endcode 
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BRD_PMC_H_
#define _BRD_PMC_H_

#include <ofc_types.h>

#ifdef __linux
#pragma GCC visibility push(default)
#endif 

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 获取当前工作模式
 * @return 返回当前工作模式, 参见[brd_def](@ref Brd_TPmcIdTag)
 */
Int32 Brd_PmcMode(void);

/**
 * 设置系统模式 
 * @param mode: 模式, 参见[brd_def](@ref Brd_TPmcIdTag)
 * @return 当返回值 >= 0 时, 表示设置成功 \n
 *         当返回值 < 0 时, 表示设置失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PmcSetMode(Int32 mode);

/**
 * 创建唤醒锁
 * @note 部分系统有效, 说明参见[brd_pmc_def]
 * @param name: 唤醒锁的名称, 说明参见[brd_pmc_def]
 * @param len: 锁名的长度, 说明参见[brd_pmc_def]
 * @return 当返回值 >= 0 时, 表示成功, 返回操作锁的句柄 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PmcCreateWakeLock(const char *name, Int32 len);

/**
 * 请求唤醒锁
 * @note 请求成功后, 使用 Brd_PmcSetMode 系统将无法休眠
 *       只有使用 Brd_PmcReleaseWakeLock 后, 系统才能正常休眠
 *       部分系统有效, 说明参见[brd_pmc_def]
 * @param handle: 唤醒锁的句柄
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PmcAcquireWakeLock(Int32 handle);

/**
 * 释放唤醒锁
 * @note 部分系统有效, 说明参见[brd_pmc_def]
 * @param handle: 唤醒锁的句柄
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PmcReleaseWakeLock(Int32 handle);

/**
 * 使能/禁止PAD保持功能
 * @note for s32k3
 *       此功能用于配置休眠唤醒期间PAD的电平保持功能;
 *       使能后, PAD在休眠模式下与唤醒后将保持使能前的IO配置电平状态, 在进入休眠模式时内部会自动使能
 *       唤醒后, 由于SIUL模块会恢复到默认值, 如果立即禁止PAD保持功能, PAD电平会恢复到默认值(高阻态)
 *       因此, 可以在禁止PAD保持功能前, 先重新配置IO, 然后再禁止PAD保持功能
 * @param en: 是否使能
 * @return 当返回值 >= 0 时, 表示设置成功 \n
 *         当返回值 < 0 时, 表示设置失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PmcEnablePadKeeping(Bool en);

#ifdef __cplusplus
}  ///< extern "C"
#endif

#ifdef __linux
#pragma GCC visibility pop
#endif 

#endif // _BRD_PMC_H_
/**
 * @} 
 */
